/**全局的事件发送监听 */
var GEvent = {

    /**添加事件监听  
     * @param {string} event 事件名  GEventType里面的枚举类型
     * @param {Function} handler 事件响应函数  
     * @param {cc.Component} component 当前脚本 this  
     * @example
     * GEvent.addListener(GEventType.Test, this.Test, this);
     */
    addListener(event, handler, component) {
        if (typeof handler != "function") {
            console.error("没有事件响应函数！");
            return;
        }
        if (!component.uuid) {
            console.error("当前component没有uuid属性！");
            return;
        }
        //记录当前脚本的事件 方便移除当前脚本注册的所有事件
        this[component.uuid] = this[component.uuid] == undefined ? [] : this[component.uuid];
        if (Array.isArray(this[component.uuid])) {
            this[component.uuid].push(event);
        } else {
            console.error("有一个跟当前脚本同名的事件！");
            return;
        }
        this[event] = this[event] ? this[event] : {};
        this[event][component.uuid] = { handler: handler, component: component };
    },

    /**移除一个事件监听  
     * @param {string} event 事件名  GEventType里面的枚举类型  
     * @param {cc.Component} component 当前脚本 this   
     * @example 
     * GEvent.removeListener(GEventType.Test, this);
     */
    removeListener(event, component) {
        if (!component.uuid) {
            console.error("当前component没有uuid属性！");
            return;
        }
        this[event] = this[event] ? this[event] : {};
        this[event][component.uuid] = null;
        delete this[event][component.uuid];
    },

    /**移除当前脚本所有的事件监听  
     * @param {cc.Component} component 当前脚本 this 
     * @example
       onDestroy(){
           GEvent.removeAllListener(this);
       },
     */
    removeAllListener(component) {
        if (!component.uuid) {
            console.error("当前component没有uuid属性！");
            return;
        }
        var events = this[component.uuid];
        if (Array.isArray(events)) {
            for (var i = 0; i < events.length; i++) {
                this[events[i]][component.uuid] = null;
                delete this[events[i]][component.uuid];
            }
        }
        this[component.uuid] = [];
        delete this[component.uuid];
    },

    /**发送事件  
     * 参数个数不限，第一个参数为事件名，其余为传递给响应函数的参数  
     * @param {string} event 事件名  GEventType里面的枚举类型  
     * @param args 传递给响应函数的参数集，可以为空 
     * @example 
     * GEvent.dispatcher(GEventType.Test, "test", 123);
     */
    dispatcher(event, ...args) {
        var onwers = this[event];
        if (onwers) {
            for (var key in onwers) {
                var data = onwers[key];
                data.handler.apply(data.component, args);
            }
        } else {
            console.warn(event + "事件还没有添加事件监听!");
        }
    },
};

window.GEvent = GEvent;

